package br.com.datasun.biblioteca.ui.components;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;
import br.com.datasun.biblioteca.entities.Categoria;
import br.com.datasun.biblioteca.entities.Assunto;

public class CategoriaTableModel extends AbstractTableModel {
	private List<Categoria> categorias;
	private List<String> colunas;
	
	public final int COLUNA_CATEGORIA = 0;
	public final int COLUNA_ASSUNTO = 1;
	private static final long serialVersionUID = 1L;
	
	public CategoriaTableModel(List<Categoria> categorias){
		this.categorias = categorias;
		if(this.categorias == null){
			this.categorias = new ArrayList<Categoria>();
		}
		/**
		 * Inicializa a lista que cont�m os nomes das colunas da tabela
		 */
		colunas = new ArrayList<String>();
		colunas.add("Categoria");
		colunas.add("Assunto");
	}
	
	public CategoriaTableModel(){
		if(this.categorias == null){
			this.categorias = new ArrayList<Categoria>();
		}
		/**
		 * Inicializa a lista que cont�m os nomes das colunas da tabela
		 */
		colunas = new ArrayList<String>();
		colunas.add("Categoria");
		colunas.add("Assunto");
	}
	
	/**
	 * Obt�m o n�mero de colunas da tabela
	 */
	public int getColumnCount() {
		return colunas.size();
	}
	/**
	 * Obtem o n�mero de linhas da tabela
	 */
	public int getRowCount() {
		return categorias.size();
	}
	
	/**
	 * Obt�m o valor contido na linha representada por indiceLinha e coluna representada por indiceColuna. 
	 * @param indiceLinha - indice da linha
	 * @param indiceColuna - indice da coluna
	 */
	public Object getValueAt(int indiceLinha, int indiceColuna) {
		String result = null;
		Categoria categoria = categorias.get(indiceLinha); //obt�m o assunto da linha
		Assunto assunto = categoria.getAssunto();
		switch (indiceColuna) {
		case COLUNA_ASSUNTO:
			result = assunto.getNome();
			break;
		case COLUNA_CATEGORIA:
			result = categoria.getNome();
			break;
		}
		return result;
	}
	
	/**
	 * Obt�m o t�tulo da coluna
	 */
	public String getColumnName(int column) {
		return colunas.get(column);
	}
	/**
	 * Obt�m o tipo de objeto que a coluna aceita
	 */
	public Class<?> getColumnClass(int columnIndex) {
		Class result = null;
		switch (columnIndex) {
		case COLUNA_ASSUNTO:
			result = String.class;
			break;		
		case COLUNA_CATEGORIA:
			result = String.class;
			break;
		}
		return result;
	}
	
	/**
	 * Altera o valor da coluna representada por indiceColuna e linha representada por indiceLinha.
	 */
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		//nenhuma celula � edit�vel

	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false; //nenhuma c�lula � edit�vel
	}
	
	public void inserir(Categoria categoria){
		categorias.add(categoria);
		fireTableStructureChanged(); //avisa listeners que a estrutura da tabela mudou - faz repaint
	}
	
	public Categoria remover(int rowIndex){
		Categoria categoria = null;
		if(rowIndex >= 0 && !categorias.isEmpty()){
			categoria = categorias.remove(rowIndex);
			fireTableStructureChanged();//avisa listeners que a estrutura da tabela mudou - faz repaint
		}
		return categoria;
	}
	
	
	public void remover(Categoria categoria){
		categorias.remove(categoria);
		fireTableStructureChanged(); //avisa listeners que a estrutura da tabela mudou - faz repaint
	}	
	
	public Categoria getCategoriaDe(int rowIndex){
		Categoria categoria = null;
		if(rowIndex >= 0 && !categorias.isEmpty()){
			categoria = categorias.get(rowIndex);
		}
		return categoria;
	}
	
	/**
	 * Substitui o objeto assunto existente no indice fornecido pelo assunto fornecido
	 * @param assunto
	 * @param indiceLinha
	 */
	public void atualizarCategoria(Categoria categoria, int indiceLinha){
		categorias.set(indiceLinha, categoria);
		fireTableRowsUpdated(indiceLinha, indiceLinha);
	}
	
	
	/**
	 * Verifica se o assunto fornecido existe no table model
	 * @param assunto
	 * @return
	 */
	public boolean existe(Categoria categoria){
		boolean result = false;
		if(!categorias.isEmpty()){
			result = categorias.contains(categoria);
		}
		return result;
	}
	public List<Categoria> getAutor(){
		return this.categorias;
	}

	
	public void setCategorias(List<Categoria>  categorias){
		this.categorias = categorias;
		fireTableStructureChanged();
	}
	
	
}
